/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica.Comandos;

import Logica.Fabricas.Comando;
import ObjetoDominio.Archivo;
import ObjetoDominio.Usuario;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * Comado que inicia la descarga de un archivo
 * @author familia
 */
public class ComandoIniciarDescarga extends Thread implements Comando<Boolean>{

    private int _tamanoArchivo;
    private int _cantidadDescargado;
    private Socket _cliente;
    private Usuario _usuario;
    private Archivo _archivo;

    public ComandoIniciarDescarga(Socket cliente, Usuario usuario, Archivo archivo){
        _cliente = cliente;
        _usuario = usuario;
        _archivo = archivo;
    }
    
    public int getCantidadDescargado() {
        return _cantidadDescargado;
    }

    public int getTamanoArchivo() {
        return _tamanoArchivo;
    }
        
    @Override
    public void run(){
        
    }

    @Override
    public Boolean Ejecutar() {
        try
        {
            ObjectOutputStream oos = new ObjectOutputStream(
                    _cliente.getOutputStream());
            boolean enviadoUltimo=false;
            FileInputStream fis = new FileInputStream(_usuario.getNombre() + "/" + 
                    _archivo.getNombre());
            Archivo mensaje = new Archivo();
            mensaje.setNombre(_archivo.getNombre());
            int leidos = fis.read(mensaje.getContenidoFichero());
            int tamaño = leidos;
            if(_archivo.getDescargado() != 0)
                _archivo.setDescargado(_archivo.getDescargado() + 
                        Archivo.LONGITUD_MAXIMA);
            while (leidos > -1)
            {
                mensaje.setBytesValidos(leidos);
                if (leidos < Archivo.LONGITUD_MAXIMA)
                {
                    mensaje.setUltimoMensaje(true);
                    enviadoUltimo=true;
                }
                else
                    mensaje.setUltimoMensaje(false);
                if(tamaño >= _archivo.getDescargado()){
                    Thread.sleep(20);
                    oos.writeObject(mensaje);
                }
                
                if (mensaje.isUltimoMensaje())
                    break;
                mensaje = new Archivo();
                mensaje.setNombre(_archivo.getNombre());
                leidos = fis.read(mensaje.getContenidoFichero());
                tamaño = tamaño + leidos;
            }
            
            if (enviadoUltimo==false)
            {
                mensaje.setUltimoMensaje(true);
                mensaje.setBytesValidos(0);
                oos.writeObject(mensaje);
            }
            oos.flush();
            oos.close();
            _cliente.close();
            return true;
        }catch (Exception e)
        {
            return false;
        }
    }
}
